<?php

namespace Cekurte;

/**
 * Classe responsável pelos formulários da aplicação
 * 
 * @author 	João Paulo Cercal
 * @version 1.0
 * 
 * @abstract
 */
abstract class Form extends \Zend_Form
{
	/**
     * @var string URL para qual o formulário será submetido
     */
	const ACTION = '';

	/**
	 * @var string Nome da classe
	 */
	protected $class_name 	= null;
	
	/**
	 * Força a implementação do método setup pelas classes filhas
	 * 
	 * @author 	João Paulo Cercal
	 * @version 1.0
	 * 
	 * @abstract
	 */
	abstract protected function setup();
    
    /**
     * Inicializa o formulário, chamando 3 métodos são eles: beforeConfig(), config() e afterConfig()
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
    public function init()
    {
        $this->beforeConfig();
        
    	$this->setup();
    	
    	$this->afterConfig();
    }
    
    /**
     * Realiza uma configuração antes da chamada para o método de configuração
     * desenvolvido para o formulário especifico de uma requisição
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
    protected function beforeConfig()
    {
    	// Configura o nome da classe, que será
    	// utilizado como referencia no formulário
    	$this->class_name = strtolower( get_class($this) );
    	
    	// Configura a ação do formulário
    	$this->setAction( self::ACTION );
        
    	// Configura o id do formulário
        $this->setName( $this->class_name );
        
        // Configura o método de envio do formulário
        $this->setMethod( self::METHOD_POST );
    }
    
    /**
     * Realiza uma configuração após a chamada para o método de configuração
     * desenvolvido para o formulário especifico de uma requisição
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     */
	protected function afterConfig()
    {
    	if( \Zend_Auth::getInstance()->hasIdentity() )
    	{
    		$this->addElement( $this->getFieldToken() );
    	}
    	
    	$this->addElements( array(
    		$this->getFieldId(),
			$this->getFieldReset(),
			$this->getFieldSubmit()
		));
    }
    
	/**
     * Cria um campo escondido tendo em seu valor um token
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	Zend_Form_Element_Hidden Um token
     */
    protected function getFieldToken()
    {
    	// Obtém a instância do registro da aplicação e pega o token
    	$token 	= \Zend_Auth::getInstance()->getIdentity()->user->token;

        // Cria um campo oculto
    	$hidden = new \Zend_Form_Element_Hidden('token', array( 'value' => $token ));
    	
    	// Remove as tags HTML padrão
    	$hidden->removeDecorator('HtmlTag');
     	$hidden->removeDecorator('Label');    
     
     	// Devolve um campo oculto Zend_Form_Element_Hidden
     	return $hidden;
    }
    
	/**
     * Cria um campo escondido tendo em seu valor um id
     * Esse campo será utilizado no caso de uma edição
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	Zend_Form_Element_Hidden Um id
     */
    protected function getFieldId()
    {
    	// Recupera o id
    	$id = \Zend_Controller_Front::getInstance()->getRequest()->getParam('id', 0);
    	
    	// Cria um campo oculto
    	$id = new \Zend_Form_Element_Hidden('id', array( 'value' => $id ));
    	
    	// Remove as tags HTML padrão
    	$id->removeDecorator('HtmlTag');
     	$id->removeDecorator('Label');    
     
     	// Devolve um campo oculto Zend_Form_Element_Hidden
     	return $id;
    }
    
    /**
     * Cria um botão submit para o formulário
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	Zend_Form_Element_Submit Um botão submit
     */
    protected function getFieldSubmit()
    {
    	// Configurações padrões de um botão submit
    	$config 		= array(
            'class'     => 'submit', 
    		'id'        => $this->class_name . '_submit',
			'label'		=> 'form.label.submit',
		);
		
        // Cria um campo no formulário, com base nas configurações acima descritas
    	return new \Zend_Form_Element_Submit('submit', $config);
    }
    
	/**
     * Cria um botão reset para o formulário
     * 
     * @author 	João Paulo Cercal
     * @version 1.0
     * 
     * @return 	Zend_Form_Element_Reset Um botão submit
     */
    protected function getFieldReset()
    {
    	// Configurações padrões de um botão submit
    	$config 		= array(
            'class'     => 'reset', 
    		'id'        => $this->class_name . '_reset',
			'label'		=> 'form.label.reset',
		);
        
        // Cria um campo no formulário, com base nas configurações acima descritas
    	return new \Zend_Form_Element_Reset('reset', $config);
    }
}
